package com.gaoshi.chapter5;

import java.util.Objects;

/**
 * 如果有一个非空构造函数，则必须显式的写出一个空参构造函数
 */
public class Manager extends Employee {
    private double bonus;

    public Manager() { }

    /**
     * 子类不能直接访问父类的私有字段，所以需要使用super()调用父类的构造器
     * 使用super()调用构造器的语句必须是子类构造器的第一条语句
     * 如果子类没有显式地调用父类的构造器，将自动地调用父类的无参构造器。如果父类没有无参数的构造器，并且在子类的构造器中又没有显式地调用父类的其他构造器，Java编译器就会报告一个错误
     */
    public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary,year, month, day);
        bonus = 0;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    /**
     * 子类不能直接访问父类的私有字段，所以需要使用super.getSalary()，如果直接使用getSalary()会一直调用自己，最后堆栈溢出
     */
    @Override
    public double getSalary() {
        return super.getSalary() + this.bonus;
    }

    @Override
    public double raiseSalary(double byPercent) {
        return super.raiseSalary(byPercent);
    }

    @Override
    public boolean equals(Object o) {
//        if (!(o instanceof Employee)) {
//            return false;
//        } else {
//            return true;
//        }
        if (!super.equals(o)) return false;
        var otherObject = (Manager) o;
        return bonus == otherObject.bonus;
    }

    @Override
    public String toString() {
        return super.toString() +
                "{bonus=" + bonus +
                '}';
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), bonus);
    }
}
